package com.cskaoyan.javase.array._6variable;

/**
 * 可变参数（variable parameter）是Java1.5时增加的新特性
 * 可变参数的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 * 	//方法体
 * }
 * 数据类型... 表示对应类型的可变参数
 * 可变参数的本质是对应数据类型的数组,可变参数在方法体中,也可以完全当成数组去处理.
 *
 * 可变参数之所以能够在方法调用时,能传入不限定个数的实参,原因在于编译器在编译代码时,会自动将可变参数的不限定个数的实参封装成一个对应类型的数组.所以可变参数的本质还是数组,没有任何区别.
 * 只不过原先数组是程序员自己创建
 * 现在是编译器编译代码时创建数组
 * 像这种实现原理不变,本质不变,但是可以节省程序员的操作,节约时间,就是一种"语法糖"
 *
 * 细节问题,注意事项:
 *      1.可变参数在方法的形参中,最多只能有一个,而且必须在形参列表的末尾.
 *      2.数据类型... 变量名 可变参数的书写格式,推荐"..."紧跟数据类型,和变量名之间加一个空格
 *      3.可变参数方法也是可以构成方法重载的:
 *          a.和固定参数个数的方法组成方法重载时,优先选择固定参数的方法
 *          b.可变参数和可变参数方法构成方法的重载时,非常容易导致两个方法都无法调用了.所以应该尽量避免可变参数和可变参数的方法构成方法重载.
 *
 * @since 14:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 测试一下不确定个数的n个数求和
        /*int[] arr = {1, 2, 3, 4, 5};
        System.out.println(sum(arr));

        System.out.println(sum(1, 1));
        System.out.println(sum(1, 1, 2));
        System.out.println(sum(1, 1, 2, 4));
        System.out.println(sum(1, 1, 2, 4, 3));*/


        // System.out.println(sum());
        // Ambiguous method call: both 'Demo.sum(int...)' and 'Demo.sum(int, int...)' match
        // sum(1, 1);

        sum(1.0,1);

    }


    // 需求: 求不确定个数的n个int数的和,方法需要传入一个int数组
    /*
        按照下列这个方法,我们必须手动创建一个数组,然后传入方法
        但我不喜欢这种方式,我希望这个方法的实参,我想输入几个就是几个
        比如我输两个int数,就是求两个int数的和,3个,就是3个数的和
     */
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._6variable.Demo'
    /*public static int sum(int[] arr) {
        // 数组元素的求和
        int sumValue = 0;
        for (int ele : arr) {
            // 遍历求和
            sumValue += ele;
        }
        return sumValue;
    }*/

    // 使用可变参数来求和
    public static int sum(int... arr) {
        // 数组元素的求和
        int sumValue = 0;
        for (int ele : arr) {
            // 遍历求和
            sumValue += ele;
        }
        return sumValue;
    }

    public static int sum(double a, int... arr) {
        // 数组元素的求和
        int sumValue = 0;
        for (int ele : arr) {
            // 遍历求和
            sumValue += ele;
        }
        return sumValue;
    }


    // public static int sum(int a, int b) {
    //     return a + b;
    // }


}
